home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Atari Compendium
/
The Atari Compendium (Toad Computers) (1994).iso
/
files
/
umich
/
tex
/
td187src.lzh
/
MTDIR.I
< prev
next >
Wrap
Text File
|
1991-06-08
|
10KB
|
350 lines
(*#########################################################################
D I R E C T O R Y
#########################################################################
V1.0 01.05.90 Peter Hellinger TDI-Modula-2
#########################################################################*)
IMPLEMENTATION MODULE mtDir;
(*------------------------------*)
(* COMPILERSWITCHES *)
(*------------------------------*)
(* TDI-Version: DEAKTIVIERT *)
(*------------------------------*)
(* V- Overflow-Checks *)
(* R- Range-Checks *)
(* S- Stack-Check *)
(* N- NIL-Checks *)
(* T- TDI-Compiler vor 3.01 *)
(* Q+ Branch statt Jumps *)
(* *)
(*------------------------------*)
(* MM2-Version: AKTIVIERT *)
(*------------------------------*)
(*$R- Range-Checks *)
(*$S- Stack-Check *)
(* *)
(*------------------------------*)
FROM SYSTEM IMPORT ADR, ADDRESS;
FROM MagicSys IMPORT Nil, Null,
Bit0, Bit1, Bit2, Bit3, Bit4, Bit5, Bit6, Bit7,
Bit8, Bit9, Bit10, Bit11, Bit12, Bit13, Bit14, Bit15,
LOC, Byte, ByteSet, sWORD, sINTEGER, sCARDINAL, sBITSET,
lWORD, lINTEGER, lCARDINAL, lBITSET,
CastToChar, CastToByte, CastToByteset, CastToInt,
CastToCard, CastToBitset, CastToWord, CastToLInt,
CastToLCard, CastToLBitset, CastToLWord, CastToAddr;
FROM MagicStrings IMPORT Append, Assign, Length, Copy, Equal, Insert, Pos;
IMPORT MagicAES, MagicVDI, MagicDOS, MagicTypes;
IMPORT XBRA;
CONST NullChar = CHR (0);
VAR version: TosVersion;
slash: ARRAY [0..0] OF CHAR;
exselector: BOOLEAN;
stack: ADDRESS;
sys[04F2H]: MagicTypes.PtrSYSHDR;
VAR Search: RECORD
name: ARRAY [0..255] OF CHAR;
attr: sBITSET;
first: BOOLEAN;
dta: MagicDOS.PtrDTA;
END;
VAR defDTA: MagicDOS.DTA;
defDtaPtr: MagicDOS.PtrDTA;
PROCEDURE GetDir (VAR pfad, name: ARRAY OF CHAR; msg: ARRAY OF CHAR): BOOLEAN;
VAR c: sCARDINAL;
m: ARRAY [0..30] OF CHAR;
b: BOOLEAN;
BEGIN
GetPath (pfad);
IF exselector THEN
Assign (msg, m); m[30]:= NullChar;
b:= MagicAES.FselExinput(m, pfad, name);
ELSE (* Normalen Selector verwenden *)
b:= MagicAES.FselInput (pfad, name);
END;
IF NOT b THEN Assign ('', name); END;
RETURN b;
END GetDir;
PROCEDURE GetPath (VAR pfad: ARRAY OF CHAR);
VAR drive, c, d: sCARDINAL;
p, suff: ARRAY [0..40] OF CHAR;
BEGIN
IF (pfad[0] = NullChar) OR (pfad[0] = '*') THEN
c:= Length (pfad);
IF c > 0 THEN
DEC (c);
WHILE (c > 0) & (pfad[c] # '.') DO DEC (c); END;
IF c > 0 THEN
d:= c;
WHILE (pfad[c] # NullChar) DO
suff [c - d]:= pfad[c]; INC (c);
END (* WHILE *);
suff[c - d]:= NullChar;
END (* IF *);
ELSE
suff[0]:= NullChar;
END (* IF *);
drive:= MagicDOS.Dgetdrv ();
Assign ('', p);
pfad[0]:= CHR (ORD ('A') + drive);
pfad[1]:= ':'; pfad[2]:= NullChar;
MagicDOS.Dgetpath (p, drive + 1);
Append (p, pfad);
Append ('\*', pfad);
IF suff[0] # NullChar THEN
Append (suff, pfad)
ELSE
Append ('.*', pfad);
END (* IF kein alter Suffix *);
END (* IF pf leer *);
END GetPath;
PROCEDURE DelTail (VAR s: ARRAY OF CHAR);
VAR c: CARDINAL;
BEGIN
c:= Length (s);
WHILE (c > 0) & (s [c - 1] # '\') DO
DEC (c); s[c]:= NullChar;
END (* WHILE *);
END DelTail;
PROCEDURE SplitPath (path: ARRAY OF CHAR; VAR pfad, name, suff: ARRAY OF CHAR);
VAR c, d, len, pLen: CARDINAL;
BEGIN
len:= Length (path);
IF len = 0 THEN RETURN; END;
pfad[0]:= NullChar;
name[0]:= NullChar;
suff[0]:= NullChar;
c:= len;
(* Suffix abspalten wenn vorhanden: *)
IF c > 0 THEN
DEC (c); (* Index des letzten Zeichens *)
WHILE (c > 0) & (path[c] # '.') DO DEC (c); END;
IF c > 0 THEN (* wir haben den Punkt gefunden *)
d:= 0;
INC (c);
WHILE (path[c] # NullChar) AND (d < 3) DO
suff[d]:= path[c]; INC (c); INC (d);
END (* WHILE *);
IF d <= HIGH (suff) THEN suff[d]:= NullChar END;
END (* IF *);
ELSE
suff[0]:= NullChar
END (* IF *);
c:= len;
IF c > 0 THEN DEC (c); END;
(* Dateinamen abspalten: *)
WHILE (c > 0) & (path[c] # '\') & (path[c] # ':') DO DEC (c); END;
IF (path[c] = '\') OR (path[c] = ':') THEN INC (c); END;
pLen:= c;
d:= 0;
FOR c:= c TO len - 1 DO name[d]:= path[c]; INC (d); END;
IF d <= HIGH (name) THEN name[d]:= NullChar; END;
(* Pfad kopieren: *)
IF pLen > 0 THEN
FOR d:= 0 TO pLen - 1 DO pfad[d]:= path[d]; END;
END (* IF *);
pfad[pLen]:= NullChar;
END SplitPath;
PROCEDURE CompletePath (VAR pfad: ARRAY OF CHAR; standard: ARRAY OF CHAR);
VAR drv, old: sCARDINAL;
dummy: lBITSET;
drvStr: ARRAY [0..1] OF CHAR;
path: ARRAY [0..255] OF CHAR;
BEGIN
IF pfad[0] = NullChar THEN
(* Pfad leer, dann Standard-Pfad verwenden *)
Assign (standard, pfad)
ELSIF pfad[0] = '\' THEN
(* Root-Dir des aktuellen Laufwerks verwenden *)
drvStr:= ' :';
drv:= MagicDOS.Dgetdrv ();
drvStr[0]:= CHR (drv + 65);
Insert (drvStr, pfad, 0);
ELSIF pfad[1] = ':' THEN
(* Laufwerksbezeichner im Pfad *)
IF pfad[2] # '\' THEN (* Standardpfad des Laufwerks verwenden *)
old:= MagicDOS.Dgetdrv ();
drv:= ORD (pfad[0]) - 65;
MagicDOS.Dsetdrv (drv, dummy);
MagicDOS.Dgetpath (path, 0);
MagicDOS.Dsetdrv (old, dummy);
drvStr[0]:= pfad[0];
drvStr[1]:= pfad[1];
Insert (drvStr, path, 0);
Assign (path, pfad);
Append (slash, pfad);
END;
ELSIF Pos (slash, pfad) > 0 THEN
Insert (standard, pfad, 0);
END;
END CompletePath;
PROCEDURE GetVersion (): TosVersion;
BEGIN
RETURN version;
END GetVersion;
PROCEDURE ExSelector (): BOOLEAN;
BEGIN
RETURN exselector;
END ExSelector;
PROCEDURE SearchParas (maske: ARRAY OF CHAR; attribut: sBITSET;
ptr: MagicDOS.PtrDTA; firsttime: BOOLEAN);
BEGIN
WITH Search DO
Assign (maske, name);
attr:= attribut;
first:= firsttime;
dta:= ptr;
END;
END SearchParas;
PROCEDURE Found (): BOOLEAN;
VAR err: sINTEGER;
BEGIN
MagicDOS.Fsetdta (Search.dta);
IF Search.first THEN
err:= MagicDOS.Fsfirst (Search.name, Search.attr);
Search.first:= FALSE;
ELSE
err:= MagicDOS.Fsnext ();
END;
RETURN (err = 0);
END Found;
PROCEDURE Exist (datei: ARRAY OF CHAR): BOOLEAN;
(* Testet, ob Datei oder Ordner schon existiert *)
VAR err: sINTEGER;
BEGIN
MagicDOS.Fsetdta (defDtaPtr);
RETURN MagicDOS.Fsfirst (datei, {0..15}) = 0;
END Exist;
PROCEDURE Replace (oldName, wildcard: ARRAY OF CHAR; VAR new: ARRAY OF CHAR);
(* Bildet aus wildcard und oldName einen neuen Dateinamen (new). *)
CONST cMaxLen = 11;
cPrefLen = 8;
PROCEDURE MakeMask (wild: ARRAY OF CHAR; VAR maske: ARRAY OF CHAR);
(* Expandiert einen Dateinamen auf 12 Zeichen, ? und * werden als ?
* eingetragen. Nichtvorhandene Zeichen werden Blanks!
*)
VAR c, d, i: CARDINAL;
BEGIN (* MachMaske *)
c:= 0; d:= 0; Assign ("????????????", maske); (* Vorgefertigte Maske *)
LOOP
IF (wild[d] = CHR(0)) OR (d = HIGH(wild)) THEN
(* Wildcard zu Ende, Rest der Maske mit Blanks auffüllen *)
FOR i:= c TO cMaxLen DO maske[i]:= " "; END;
RETURN;
ELSIF (wild[d] = "*") THEN
(* Auf einen * muß ein Punkt in der Wildcard folgen! *E*.MOD ist illegal! *)
INC(d, 2); (* Punkt auslassen *)
EXIT; (* Fertig mit Prefix-Teil *)
ELSIF (wild[d] = ".") THEN
(* Punkt gefunden, Prefix bis zur Maximalen Länge mit Blanks auffüllen *)
FOR i:= c TO cPrefLen DO maske[i]:= " "; E